//
//  Vector_memctl.swift
//  SwiftyDSA
//
//  Created by Archer on 2018/8/5.
//  Copyright © 2018年 Archer. All rights reserved.
//

import Foundation

/// 可扩充性
extension Vector {
    /// 扩容
    func _expand() {
        // 还要空间不必扩容
        if _size < _capacity { return }
        // 不至收缩到默认容量以下
        _capacity = max(_capacity, kVectorDefaultCapacity)
        // 每次扩充一倍
        _capacity *= 2
        // 切换到新容量下
        _fit(capacity: _capacity)
    }
    
    /// 减容
    func _shrink() {
        // 不满足装填因子
        if _size.toDouble() / _capacity.toDouble() >= kVectorDefaultLoadFactor { return }
        // 每次减容一半
        _capacity = (_capacity.toDouble() / 2).toInt()
        // 不至收缩到默认容量以下
        _capacity = max(_capacity, kVectorDefaultCapacity)
        // 切换到新容量下
        _fit(capacity: _capacity)
    }
    
    func _fit(capacity: Int) {
        // 分配新空间
        let newStorage = Allocator.allocate(_capacity, for: Element.self)
        // 逐成员复制
        for i in indices { newStorage[i] = _storage[i] }
        // 释放旧内存
        _storage.deallocate()
        // 指向新内存
        _storage = newStorage
    }
}
